<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="node_modules/babel-core/browser.min.js"></script>
</head>
<script type="text/babel">
    let CreatePromise = (args) => {
        let p = new Promise((resolve, reject) => {
            if (args > 0) {
                reject("reject args length gt 0") // 失败
            } else {
                resolve("resolve args length le 0") // 成功
            }
        });
        return p // 返回 promise 对象
    };

    CreatePromise(1111).then(res => { // 通过对象 继续判断
        console.log(res)
    }).catch(err => {
            console.log(err) // todo reject args length gt 0
        }
    );

    console.log(`====================${"promise.all"}=================================`)
    let pp = Promise.resolve(11111111111);
    // let pp1 = Promise.reject(222222222);

    Promise.all([pp, pp]).then(res => { // all 必须确保 都是成功的，todo catch是第一个返回错误的err, 每个元素都要返回promise对象,成功则一起返回
        let [a, b] = res
        console.log("promise.all", a, b)
    });

    console.log(`====================${"promise.race"}=================================`)
    let pp1 = Promise.resolve(11111111111);
    let pp2 = Promise.reject(222222222);

    Promise.race([pp1, pp2]).then(res => { //  race 至少有一个成功就可以,todo 只返回第一个 成功或失败的结果 可能错误返回更快
        console.log("promise.race,then", res)
    }).catch(err => {
        console.log("promise.race,catch", err)
    })


    // todo catch() 只有当 promise 失败时才会调用
    let promiseTest = () => {
        let p = new Promise((resolve, reject) => {
            resolve("success")     // 模拟成功
        }).then(res => {
            console.log(res) // success
        }).catch(err => {
            console.log(err)
        });
        // console.log(p)
    };
    promiseTest(); // success

    let promiseTest2 = () => {
        let p = new Promise((resolve, reject) => {
            reject("err")     // 模拟成功
        }).then(res => {
            console.log(`this is then:${res}`)
        }).catch(err => {
            console.log(`this is catch:${err}`)
        });
        // console.log(p)
    };
    promiseTest2(); // this is err

    console.log(`====================${"resolve 只能接受一个参数，可以用数组或对象Promise.resolve([p1, p2])"}=================================`)
    console.log(`====================${"串联两个请求"}=================================`)
    let status = 200;
    let statusInfo = 200;
    let defautlReturn = {Name: "aa", success: 1, token: "abcdefg"}
    let userLogin = (resolve, reject) => {  // todo 第一步 登录
        setTimeout(() => {  // 模拟ajax  ajax判断成功在调用 resolve
            if (status == 200) {
                resolve(defautlReturn) // todo resolve 只能接受一个参数，可以用数组或对象Promise.resolve([p1, p2])
            } else {
                let json1 = {}
                let json = {token: "", success: 0};
                json1 = Object.assign({}, defautlReturn, json);
                reject(json1)
            }
        }, 1000)
    };


    let userInfo = (data) => {  // todo 第二步 获取 用户信息
        console.log(data.token) // 包裹一层函数 ，用来 传递上一步的参数
        let tmpp = (resolve,reject) => {
            setTimeout(() => {  // 模拟ajax  ajax判断成功在调用 resolve
                if (statusInfo == 200 && data.token !="") {
                    resolve({Name: "aa", success: 1, data: "userInfo1"})
                } else {
                    let json1 = {}
                    let json = {token: "", success: 0};
                    json1 = Object.assign({}, defautlReturn, json);
                    reject(json1)
                }
            }, 1000)
        };
        return new Promise(tmpp) // 这里要返回promise对象 ，否则 不能往后执行
    };
    new Promise(userLogin).then(res => {
        console.log(res); //  {Name:"aa",success:1,token:"abcdefg"}
        return userInfo(res) // todo 用户登录步骤成功后，建立新的promise对象发到后面的步骤，将第一步结果发送给第二步
    }).then(res => { // 上面步骤返回 成功则会到这里
        console.log(res)
    }).catch(err => { // 上面两个步骤任一 失败，都会到这里
        console.log("",err)
    })

</script>
<body>

</body>
</html>